package com.hb.C_Lambda表达式和集合.高阶函数


/*
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element)
  }


  高阶函数的基本概念：
  1. 传入或者返回函数的函数
  2. 函数引用 ::println
  3. 带有Receiver的引用 pdfPrint::println
 */
fun main() {
    var items = listOf<String>("a", "b", "c", "d")
    //1.根据函数的定义
    items.forEach({ a ->
        println(a)
    })
    println("----------")
    //2.根据函数定义传递
    val print = fun(name: String) {
        println(name)
    }
    items.forEach(print)
    println("----------")
    //3.看源码类似这样的效果
    for (element in items) {
        println(element)
    }
    println("----------")
    //4.还可以这样
    items.forEach {
            a ->
        println(a)
    }

    println("----------")
    //5.如果这个函数只接收一个参数，那我们可以使用 it 引用，而不用去指定左边的参数。
    items.forEach {
        println(it)
    }

    println("----------")
    //5.还可以这样
    //forEach接收的是一个lambda表达式，他允许接收一个没有返回值的函数对象作为参数，println的功能是打印值
    items.forEach(::println)

    //测试拿到方法的引用,通过类名去限定方法在哪个类中
    //fun test(kotlin.Int, kotlin.Int): kotlin.Unit
    println(A::test)

    println("----------")

    //::的使用
    val aTest = A::test

    val list = listOf<String>("aa", "", "bb")
    //filter接收的是一个有参数的函数
    //String的isNotEmpty是貌似没有参数的
    //public inline fun CharSequence.isNotEmpty(): Boolean = length > 0
    //isNotEmpty的默认参数就是CharSequence
    //所以String::isNotEmpty表示的是isNotEmpty(str:String),意思就是String调用了
    //这个方法，则isNotEmpty接收的默认参数是String的实例
    list.filter(String::isNotEmpty).forEach(::println)

    println("----------")

    //forEach接收的参数是拥有一个参数没有返回值的lambda函数
    val pdfPrint = PdfPrint()
    list.forEach(pdfPrint::println)
//    list.forEach(PdfPrint::println)  //错误

    println("----------")
    println(PdfPrint::println)
    println(pdfPrint::println)
}


class A{
    fun test(){
        println("Hello")
    }
}

class PdfPrint{
    fun println(any: Any){
        kotlin.io.println(any)
    }
}